package com.goodlearning.gloriamobile.activity;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.goodlearning.gloriamobile.R;
import com.goodlearning.gloriamobile.commons.Constants;
import com.goodlearning.gloriamobile.commons.Utils;
import com.goodlearning.gloriamobile.customview.ButtonGroup;

/**
 * 현재 FragmentActivity 를 확장했다 . 기존 google Map v1 을 사용 했을때는 MapActivity 를 확장하였으나
 * v1 은 더이상 사용 할 수 없으며 v2 를 사용 해야 함으로 FragmentActivity 로 확장한다.
 * 
 * @author rapty54
 * 
 */
public class BaseActivity extends FragmentActivity {

	private final String EXTRA_KEY_FORCE_EXIT = "EXTRA_KEY_FORCE_EXIT";

	private static final List<Activity> activityList = new ArrayList<Activity>();

	public Button  baseTitleRightBtn;

	public TextView baseTitleTv,baseTitleLeftBtn;
	
	private ButtonGroup bottomBtnGrp;

	private boolean firstResume = true;

	private static int prevGrpIdx = 0;
	
	private final int[] bottomMenuBtns = { R.id.bottomMenu_jobInfo_Button,
			R.id.bottomMenu_recommand_Button, R.id.bottomMenu_event_Button,
			R.id.bottomMenu_moreView_Button };

	/**
	 * 하단버튼 포커싱을 위한 액티비티 구별 각 첫행에 연장되는 각열에 요소들을 배열에 정위치한다. 
	 */
	private final Class[][] activityArrForTabSelection = { 
			{ Plan.class }
			
			,{Notification.class 
			 ,NotificationDetailWebview.class}
			
			,{Administration.class
			,AdministrationInProgress.class
			,AdministrationInTheEnd.class
			,AdministrationAgencyPractice.class
			,AdministrationCheckSchedule.class
			,AdministrationPayTution.class}
			
			,{ More.class, MoreGloriaMapPosition.class }};

	private final Class[] topGroupActivities = { 
			Plan.class
			,Notification.class
			,Administration.class
			, More.class };

	/**
	 * 종료될때 여기서 다 종료 시킨다.
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		ViewGroup vg = ((ViewGroup) getWindow().getDecorView());
		if (EXTRA_KEY_FORCE_EXIT.equals(getIntent().getStringExtra(EXTRA_KEY_FORCE_EXIT))) {
			finish();
		}

		if (!activityList.contains(this)) {
			activityList.add(this);
		}
	}

	/**
	 * 보통 Android 에서 setContentView 로 해당 Activity 에 layout 초기화로 로딩시에 동작하는 부분을
	 * 재정의 하였다. 이부분은 현재 BaseActivity 를 상속받은 하위 Activity 그룹 초기 진입시 초기화 되어지는 부분이다.
	 * 로그로 출력 확인시 이부분에서도 확인 되지 않는다. 아마도 Native 쪽에서만 확인 가능할 것 같다.
	 */
	@Override
	public void setContentView(int layoutResID) {
		super.setContentView(R.layout.base_layout);
		View view = LayoutInflater.from(this).inflate(layoutResID, null);
		((LinearLayout) findViewById(R.id.body_LinearLayout)).addView(view,new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
		setTitleBar();
		setBottomMenu();
		
	}

	/**
	 * 상단타이틀바를 활성화 한다. 타이틀바 구분선 추가 검은색  
	 */
	private void setTitleBar() {
		baseTitleLeftBtn = (TextView) findViewById(R.id.title_left_button);
		baseTitleTv = (TextView) findViewById(R.id.title_TextView);
		baseTitleRightBtn = (Button) findViewById(R.id.title_right_button);
		baseTitleTv.setSelected(true);
		baseTitleLeftBtn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		
	}
	/**
	 * 각 Activity 기동시에 메인 BaseActivity 는 고정시킨 상태에서 사용자에게 보여질 메인 Body 부분만 Animation 이동한다.
	 */
	@Override
	protected void onResume() {
		super.onResume();
		Class thisClass = this.getClass();
		// 하단탭바를 선택하고 이전 탑그룹 인덱스를 저장
		for (int i = 0; i < activityArrForTabSelection.length; i++) {
			for (int j = 0; j < activityArrForTabSelection[i].length; j++) {
				if (thisClass.equals(activityArrForTabSelection[i][j])) {
					// 하단탭바 선택
					Utils.log("SelectedBtn_Idx:" + "[" + i + "]");
					bottomBtnGrp.setSelectedBtnForIdx(i);
					
					this.overridePendingTransition(0, 0);
					
					 if(prevGrpIdx == i){
					 ((LinearLayout)findViewById(R.id.body_LinearLayout)).setAnimation(AnimationUtils.loadAnimation(this,firstResume ? R.anim.slide_in_right :android.R.anim.slide_in_left ));
					 }else{
					 ((LinearLayout)findViewById(R.id.body_LinearLayout)).setAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in ));
					 }
					 
					firstResume = false;
					prevGrpIdx = i;
					break;
				}
			}
		}
	}

	/**
	 * 하단메뉴를 활성화 한다.
	 */
	private void setBottomMenu() {
		bottomBtnGrp = new ButtonGroup(this, bottomMenuBtns, true);
		bottomBtnGrp
				.setOnCheckedChangeListener(new ButtonGroup.OnCheckedChangeListener() {
					@Override
					public void onCheckedChange(Button button) {

						activityReOrder(bottomBtnGrp.getCheckedButtonIdx());
					}
				});
	}
	
	/**
	 * BaseActivity를 상속받은 모든  Activity 를 종료시킨다.
	 */
	public void allClearActivity() {

		for (int i = 0; i < activityArrForTabSelection.length; i++) {
			for (int j = 0; j < activityArrForTabSelection[i].length; j++) {
				Intent intent = new Intent(this, activityArrForTabSelection[i][j]).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				intent.putExtra(EXTRA_KEY_FORCE_EXIT, EXTRA_KEY_FORCE_EXIT);
				startActivity(intent);
			}
		}
		for (int i = 0; i < topGroupActivities.length; i++) {
			Intent intent = new Intent(this, topGroupActivities[i]).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			intent.putExtra(EXTRA_KEY_FORCE_EXIT, EXTRA_KEY_FORCE_EXIT);
			startActivity(intent);
		}
	}
	
	/**
	 * 하단 Button 그룹들에 대한 IDX 값들을 리턴받아 비교하고 그 자료 구성들로 이벤트 따로 구현 
	 * @param idx
	 */
	private void activityReOrder(int idx) {

		int reStartCnt = 0;
		// System.out.println("~~~~~~~~~~~**************************activityList.size() : "+activityList.size());
		for (int i = 0; i < activityList.size(); i++) {
			for (int j = 0; j < activityArrForTabSelection[idx].length; j++) {
				Class activity = activityArrForTabSelection[idx][j];
				// Utils.showLog(activity+" /-------------/  "+
				// activityList.get(i).getClass());
				if (activity.equals(activityList.get(i).getClass())&& !activityList.get(i).isFinishing()) {
					// Utils.showLog("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"+activity);
					startActivity(new Intent(this, activity).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
					reStartCnt++;
				}
			}
		}

		if (reStartCnt == 0) {
			startActivity(new Intent(this, topGroupActivities[idx]).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
		}
	}
	/**
	 * R.id.empty_TextView 해당하는 View가 존재한다면 노출여부를 결정  
	 * @param visible
	 */
	public void setVisibleEmptyArea(boolean visible){
		TextView emptyTv = (TextView)findViewById(R.id.empty_TextView);
		if(emptyTv != null){
			Utils.log("VISIBLE_STATE:"+"["+visible+"]");
			emptyTv.setVisibility(visible ? View.VISIBLE : View.GONE);
		}
	}
	
	/**
	 * R.id.empty_TextView 해당하는 View가 존재한다면 노출여부를 결정  
	 * @param visible
	 */
	public void setVisibleEmptyAreaOtherType(boolean visible){
		TextView emptyTv = (TextView)findViewById(R.id.empty_TextView_other_type);
		if(emptyTv != null){
			Utils.log("VISIBLE_STATE:"+"["+visible+"]");
			emptyTv.setVisibility(visible ? View.VISIBLE : View.GONE);
		}
	}
	/** 좀 머랄까 골때리지만 현재 로선 모든 BaseActivity 를 확장한 Activity 에서 는 해당 ID / PW 정보를 언재든 꺼내 쓸수 있게 조치했다.
	 * 후에 필요없음 없애자. 
	 * ㅡ,.ㅡ
	 * @return 
	 */
	public String getUserId(){
		return Utils.getStringByPreference(this, Constants.PRE_STRING_USER_ID, null);
	}
	
	/**
	 * ㅡ,.ㅡ
	 * @return
	 */
	public String getPassWord(){
		return Utils.getStringByPreference(this, Constants.PRE_STRING_USER_PW, null);
	}
	
}
